package com.lcy.algorithm.huawei;

import java.util.Scanner;

/**
 * 题目描述:
 * 已知火星人使用的运算符为#、$ ,其与地球人的等价公式如下:
 * x#y = 4*x+3*y+2
 * x$y = 2*x+y+3
 * 1、其中x、y是无符号整数
 * 2、地球人公式按C语言规则计算
 * 3、火星人公式中, #的优先级高于$ ,相同的运算符,按从左到右的顺序计算
 * 现有- -段火星人的字符串报文,请你来翻译并计算结果。
 * 输入描述:火星人字符串表达式(结尾不带回车换行)
 * 输入的字符串说明:字符串为仅由无符号 整数和操作符(#、$ )组成的计算表达式。例如: 123#4$5#67$78。
 * 1、用例保证字符串中，操作数与操作符之间没有任何分隔符。
 * 2、用例保证操作数取值范围为32位无符号整数。
 * 3、保证输入以及计算结果不会出现整型溢出。
 * 4、保证输入的字符串为合法的求值报文,例如: 123#4$5#67$78
 * 5、保证不会出现非法的求值报文，例如类似这样字符串:
 * #4$5 //缺少操作数
 * 4$5# //缺少操作数
 * 4#$5 //缺少操作数
 * 4 $5 //有空格
 * 3+4-5*6/7 //有其它操作符
 * 12345678987654321$54321 //32位整数计算溢出
 * 输出描述:根据输入的火星人字符串输出计算结果(结尾不带回车换行)
 *
 * 不例1
 * 输入: 7#6$5#12
 * 输出: 157
 * 说明:示例:
 * 7#6$5#12
 * =(4*7+3*6+ 2)$5#12
 * =48$5#12
 * =48$(4*5+3*12+2)
 * =48$58
 * = 2*48+ 58+3
 * =157
 */
public class 火星文计算 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        System.out.println(evaluateExpression(input.replaceAll(" ","")));
    }

    public static int evaluateExpression(String expression) {
        StringBuilder sb = new StringBuilder(expression);
        int index = 0;
        // 计算#运算符
        while ((index = sb.indexOf("#", index)) != -1) {
            String left = findLeftOperand(sb, index);
            String right = findRightOperand(sb, index);
            int value = 4 * Integer.valueOf(left) + 3 * Integer.valueOf(right) + 2;
            String valueStr = String.valueOf(value);
            sb.replace(index - left.length(), index + 1 + right.length(), valueStr);
            index += valueStr.length() - 1;
        }

        index = 0; // 重置索引

        // 计算$运算符
        while ((index = sb.indexOf("$", index)) != -1) {
            String left = findLeftOperand(sb, index);
            String right = findRightOperand(sb, index);
            int value = 2 * Integer.valueOf(left) + Integer.valueOf(right) + 3;
            String valueStr = String.valueOf(value);
            sb.replace(index - left.length(), index + 1 + right.length(), valueStr);
            index += valueStr.length() - 1;
        }

        // 解析最终结果
        return Integer.parseInt(sb.toString());
    }

    // 从指定位置向左找到操作数
    private static String findLeftOperand(StringBuilder sb, int index) {
        int i = index - 1;
        while (i >= 0 && Character.isDigit(sb.charAt(i))) {
            i--;
        }
        return sb.substring(i + 1, index);
    }

    // 从指定位置向右找到操作数
    private static String findRightOperand(StringBuilder sb, int index) {
        int i = index + 1;
        while (i < sb.length() && Character.isDigit(sb.charAt(i))) {
            i++;
        }
        return sb.substring(index + 1, i);
    }
}
